﻿# 设置自动化打开的浏览器访问网址
import traceback
from datetime import datetime

from PIL import Image
from selenium.webdriver.common.by import By
from selenium import webdriver
import time
import ocr
import os
import json


def do(t_id):
    # 创建json文件
    # jn()
    # 打开网页
    time.sleep(2)
    url = 'http://www.gjsy.gov.cn/sydwfrxxcx/'
    # 设置工作目录
    os.chdir("E:/PycharmProjects/pythonProject/webapi/")
    # 设置谷歌浏览器driver的目录所在
    # path = 'C:/user/Administrator/AppData/Local/Google/Chrome/Application/chromedriver'
    options = webdriver.ChromeOptions()
    # options.binary_location = "C:/user/Administrator/AppData/Local/Google/Chrome/Application/chrome.exe"

    # Chrome在root权限下跑（add_argument 添加启动项）
    options.add_argument('--no-sandbox')            #这个含义是使用硬盘来存储获取的内容，而不是使用内存，
    options.add_argument('--disable-dev-shm-usage') #所以会稍稍降低分布式爬取时爬虫的速率
    options.add_argument('--headless')              #无头浏览
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    options.add_experimental_option('useAutomationExtension', False)
    browser = webdriver.Chrome(options=options)
    # 防止网页发现为selenium
    browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    # 打开浏览器，并访问设置的网址。
    try:
        browser.get(url)
    except Exception as exception:
        browser.quit()
        ts = time.strftime("%Y-%m-%d %H:%M", time.localtime())
        # 详细错误
        f = open('./conf//query/log.txt', 'a+')
        f.write('错误日志：' + '\t' + ts + '\n' + str(exception) + '\n' + traceback.format_exc() + '\n')
        f.write("错误查询：" + t_id + '\n')
        f.close()
        return json.dumps({"name": "none"})

    # 窗口最大化
    # 循环尝试识别验证码
    time.sleep(2)
    i = 0
    while True:
        time.sleep(2)
        i = i + 1
        # 嵌入网页信息获取
        t1 = browser.find_element_by_xpath('/html/body/div[2]/div[2]/div')
        t2 = t1.find_element_by_tag_name('iframe')
        browser.switch_to.frame(t2)
        # 查找所有input标签（list属性）
        browser.find_elements(By.TAG_NAME, 'input')[3].click()

        # 点击输入框进行输入(输入事业单位信息)
        browser.find_element_by_id('s').click()
        # 两步实现数据输入
        elem = browser.find_element_by_id("s")
        elem.send_keys(t_id)
        # 验证码截图
        # img = pyautogui.screenshot(region=[1068, 533, 149, 42])
        # img.save("./database/images/PILImage.jpg")

        # 获取当前时间str(包含时、分、秒、毫秒)
        t = datetime.now().strftime('%H%M%S%f')
        img_name = t + 'i.jpg'

        browser.save_screenshot('./database/images/' + img_name)

        img = Image.open('./database/images/' + img_name)
        cropped = img.crop((609, 416, 756, 455))
        cropped = cropped.convert('RGB')

        save_name = t + 's.jpg'
        cropped.save('./database/images/' + save_name)
        # 验证码识别
        data = ocr.run(save_name)

        # 点击验证码输入框
        browser.find_element_by_id('random').click()
        # 两步实现数据输入
        elem = browser.find_element_by_id("random")
        elem.send_keys(data)
        # 点击查询
        browser.find_element_by_xpath('//*[@id="searchform"]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/'
                                      'td[2]/table/tbody/tr/td/table/tbody/tr[9]/td[2]/input').click()
        try:

            tx = browser.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/'
                                               'td/table/tbody/tr/td/table/tbody/tr[3]/td').text
            if tx == '您所查询的单位不存在，请注意所输入的统一社会信用代码或名称是否准确':
                browser.quit()
                return json.dumps({"name": "none"})
        except Exception as e:
            print(e)

        # 判断信息输入是否正确
        try:
            time.sleep(2)
            # 信用代码
            num = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/tbody/tr[4]/td[2]'
                                                ).text
            # 基础信息
            base = browser.find_element_by_xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[1]'
                                                 '/td[2]/table/tbody/tr[2]/td/table/tbody/tr/td').text

            status = str(base).split('\n')[3].split(' ')[1]

            if status == '该单位已注销':
                name = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/tbody/'
                                                     'tr[2]/td[2]').text

                logon = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/tbody/'
                                                      'tr[8]/td[2]').text

                messages = {'name': name, 'status': status, 'logon': logon, 'num': num}
                browser.quit()
                return json.dumps(messages)

            else:
                # 名称
                name = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/tbody/'
                                                     'tr[2]/td[2]').text
                # 宗旨和业务范围
                rule = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/tbody/'
                                                     'tr[6]/td[2]').text
                # 地址
                address = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                        'tbody/tr[8]/td[2]').text
                # 法人
                represent = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                          'tbody/tr[10]/td[2]').text
                # 经费来源
                attribute = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                          'tbody/tr[12]/td[2]').text
                # 开办资金
                capital = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                        'tbody/tr[14]/td[2]').text
                # 举办单位
                organizer = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                          'tbody/tr[16]/td[2]').text
                # 有效期
                term = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                     'tbody/tr[18]/td[2]').text
                # 单位状态
                status = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                       'tbody/tr[20]/td[2]').text
                # 登记管理机关
                logon = browser.find_element_by_xpath('//*[@id="div_result9"]/table/tbody/tr[2]/td/table/'
                                                      'tbody/tr[22]/td[2]').text
                messages = {'name': name, 'status': status, 'logon': logon, 'num': num, 'rule': rule,
                            'address': address, 'represent': represent, 'attribute': attribute, 'capital': capital,
                            'organizer': organizer, 'term': term}

                # 添加变更信息
                # 点击公告信息
                browser.find_element_by_xpath('//*[@id="tab_primary1"]').click()
                # 获取公告信息记录
                menu_table = browser.find_element_by_xpath('//*[@id="div_content1"]')
                rows = menu_table.find_elements_by_tag_name('table')

                # 变更次数循环记录
                j = len(rows)

                # 错误次数循环记录
                k = 0
                # 公告信息按钮
                str_c = '//*[@id="div_content1"]/table[1]/tbody/tr[1]/td[4]/a'
                # 公告信息标题
                str_notice = '//*[@id="div_content1"]/table[2]/tbody/tr[1]/td[2]'

                changes = ['名称的变更', '宗旨和业务的变更', '住所的变更', '法定代表人的变更', '经费来源的变更', '开办资金的变更',
                           '举办单位的变更', '有效期的变更', '单位状态的变更', '登记管理机关的变更']
                i_changes = ['name', 'rule', 'address', 'represent', 'attribute',
                             'capital', 'organizer', 'term', 'status', 'logon']
                # 定义初始数组
                hh = []

                while j > 0:
                    try:
                        time.sleep(2)
                        # 初始化变更信息

                        his = {'time': '', 'name': '', 'rule': '', 'address': '', 'represent': '',
                               'attribute': '', 'capital': '', 'organizer': '', 'term': '',
                               'status': '', 'logon': ''}

                        time.sleep(1)
                        browser.find_element_by_xpath(str_c[:30] + str(j) + str_c[31:]).click()

                        notice = browser.find_element_by_xpath(str_notice[:30] + str(j) + str_notice[31:]).text

                        browser.switch_to.window(browser.window_handles[-1])

                        # 获取当前时间str(包含时、分、秒、毫秒)
                        t = datetime.now().strftime('%H%M%S%f')
                        img_name = t + 'o.jpg'

                        browser.save_screenshot('./database/images/' + img_name)

                        img = Image.open('./database/images/' + img_name)
                        cropped = img.crop((271, 238, 494, 284))
                        cropped = cropped.convert('RGB')

                        save_name = t + 'p.jpg'
                        cropped.save('./database/images/' + save_name)
                        # 验证码识别
                        data = ocr.run(save_name)
                        browser.find_element_by_xpath('//*[@id="random"]').click()
                        # 两步实现数据输入
                        elem = browser.find_element_by_xpath('//*[@id="random"]')
                        elem.send_keys(data)
                        # 点击查询
                        browser.find_element_by_xpath('//*[@id="picForm"]/table/tbody/tr[3]/td[3]/input').click()

                        # 获取公告时间
                        t = browser.find_element_by_xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[3]/td/'
                                                          'table/tbody/tr[2]/td').text
                        time_notice = str(t).split('：')[1]

                        if notice == '设立登记':

                            i_str = ['单位名称', '宗旨和业务范围', '住所', '法定代表人', '经费来源', '开办资金',
                                     '举办单位', '有效期', '单位状态', '登记管理机关']
                            j_str = ['initial_name', 'initial_rule', 'initial_address', 'initial_represent',
                                     'initial_attribute', 'initial_capital', 'initial_organizer', 'initial_term',
                                     'initial_status', 'initial_logon']
                            messages.update({'initial_time': time_notice})
                            menu = browser.find_element_by_xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr[3]/td')
                            s = str(menu.text)
                            ss = s.split('\n')
                            for i in ss:
                                for x in i_str:
                                    if i == x:
                                        # 匹配位置
                                        u = i_str.index(i)

                                        # 匹配文本
                                        m = ss[ss.index(i) + 1]
                                        messages.update({j_str[u]: m})
                        else:
                            if time_notice != '':
                                his['time'] = time_notice
                                # 获取变更信息
                                menu = browser.find_element_by_xpath('/html/body/table/tbody/tr[2]/td/table/tbody/'
                                                                     'tr[3]/td')
                                s = str(menu.text)
                                # 变更信息数组
                                ss = s.split('\n')
                                # 变更信息确认及记录
                                for i in ss:
                                    for x in changes:
                                        if i == x:
                                            # messages位置确认
                                            u = (i_changes[changes.index(x)])
                                            # 信息录入messages
                                            m = (ss[ss.index(i) + 1].split('原：')[1].split('）')[0])
                                            his.update({u: m})
                                hh.append(his)
                        browser.close()
                        browser.switch_to.window(browser.window_handles[0])
                        # 嵌入网页信息获取
                        t1 = browser.find_element_by_xpath('/html/body/div[2]/div[2]/div')
                        t2 = t1.find_element_by_tag_name('iframe')
                        browser.switch_to.frame(t2)
                        j -= 1
                    except Exception as exception:
                        k += 1
                        if k > 15:
                            browser.quit()
                            ts = time.strftime("%Y-%m-%d %H:%M", time.localtime())
                            # 详细错误
                            f = open('./conf/institution/query/log.txt', 'a+')
                            f.write('错误日志：' + '\t' + ts + '\n' + str(exception) + '\n' + traceback.format_exc() + '\n')
                            f.write("错误查询：" + t_id + '\n')
                            f.close()
                            return json.dumps({"name": "none"})
                        else:
                            browser.close()
                            browser.switch_to.window(browser.window_handles[0])
                            browser.save_screenshot('./database/images/' + 'img_name2.jpg')
                            # 嵌入网页信息获取
                            t1 = browser.find_element_by_xpath('/html/body/div[2]/div[2]/div')
                            t2 = t1.find_element_by_tag_name('iframe')
                            browser.switch_to.frame(t2)
                            continue
                browser.quit()
                jsn = json.loads((json.dumps(messages)))
                jsn['history'] = hh
                return json.dumps(jsn)
        except Exception as exception:
            if i > 15:
                browser.quit()
                ts = time.strftime("%Y-%m-%d %H:%M", time.localtime())
                # 详细错误
                f = open('./conf/institution/query/log.txt', 'a+')
                f.write('错误日志：' + '\t' + ts + '\n' + str(exception) + '\n' + traceback.format_exc() + '\n')
                f.write("错误查询：" + t_id + '\n')
                f.close()
                return json.dumps({"name": "none"})
            else:
                # 刷新网页
                browser.refresh()
                continue


if __name__ == '__main__':
    do('')
